package org.eyeTopLight.po.authEntity;

import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.oauth2.provider.ClientDetails;
import org.eyeTopLight.utilities.SharedUtilities;
import java.util.*;

/**
 * 单点登陆的信息文件，对应数据库表oauth_client_details
 */
@Data
@NoArgsConstructor
public class Client implements ClientDetails {
    //用于唯一标识每一个客户端(client); 在注册时必须填写(也可由服务端自动生成).
    private  String client_id;
    //客户端所能访问的资源id集合,多个资源时用逗号(,)分隔,如: "unity-resource,mobile-resource".
    private  String resource_ids;
    //用于指定客户端(client)的访问密匙; 在注册时必须填写(也可由服务端自动生成).
    private  String client_secret;
    //指定客户端申请的权限范围,可选值包括read,write,trust;若有多个权限范围用逗号(,)分隔,如: "read,write".
    private  String scope;
    //指定客户端支持的grant_type,可选值包括authorization_code,password,refresh_token,implicit,client_credentials, 若支持多个grant_type用逗号(,)分隔,如: "authorization_code,password".
    private  String authorized_grant_types;
    //客户端的重定向URI,可为空, 当grant_type为authorization_code或implicit时, 在Oauth的流程中会使用并检查与注册时填写的redirect_uri是否一致.
    private  String web_server_redirect_uri;
    //指定客户端所拥有的Spring Security的权限值,可选, 若有多个权限值,用逗号(,)分隔, 如: "ROLE_UNITY,ROLE_USER".
    //对于是否要设置该字段的值,要根据不同的grant_type来判断, 若客户端在Oauth流程中需要用户的用户名(username)与密码(password)的(authorization_code,password),
    //则该字段可以不需要设置值,因为服务端将根据用户在服务端所拥有的权限来判断是否有权限访问对应的API.
    private  String authorities;
    //设置用户是否自动Approval操作, 默认值为 'false', 可选值包括 'true','false', 'read','write'.
    //该字段只适用于grant_type="authorization_code"的情况,当用户登录成功后,若该值为'true'或支持的scope值,则会跳过用户Approve的页面, 直接授权.
    private  boolean autoapprove;

    @Override
    public String getClientId() {
        return client_id;
    }

    @Override
    public Set<String> getResourceIds() {
        return SharedUtilities.getInstance().convertStringToSet(this.resource_ids);
    }

    @Override
    public boolean isSecretRequired() {
        return true;
    }

    @Override
    public String getClientSecret() {
        return client_secret;
    }

    @Override
    public boolean isScoped() {
        return false;
    }

    @Override
    public Set<String> getRegisteredRedirectUri() {
        return SharedUtilities.getInstance().convertStringToSet(this.web_server_redirect_uri);
    }

    @Override
    public Collection<GrantedAuthority> getAuthorities() {
        return SharedUtilities.getInstance().convertStringToList(this.authorities);
    }



    @Override
    public Integer getAccessTokenValiditySeconds() {
        return null;
    }

    @Override
    public Integer getRefreshTokenValiditySeconds() {
        return null;
    }

    @Override
    public boolean isAutoApprove(String scope) {
        return false;
    }

    @Override
    public Map<String, Object> getAdditionalInformation() {
        return null;
    }

    @Override
    public Set<String> getAuthorizedGrantTypes(){
        return SharedUtilities.getInstance().convertStringToSet(this.authorized_grant_types);
    }

    public Set<String> getScope(){

        return SharedUtilities.getInstance().convertStringToSet(scope);
    }

}
